/**
 1，通过线程池解决线程管理问题
 2.重写一个用户线程类
 */


package 第十一章_网络编程.服务端_客户端_echo实例;

import javafx.concurrent.Service;

import java.io.*;
import java.lang.reflect.Executable;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class 并发_服务端小实例 {
    public static void main(String [] args) throws IOException {
        //创建线程池对象es 管理线程数量3 （FixedThreadPool 是固定大小 当达到上限 就不会创建新的线程）
        ExecutorService es= Executors.newFixedThreadPool(3);
        ServerSocket server=new ServerSocket(6666);
        System.out.println("服务器已启动，正在等待连接...");
        while(true){
            Socket s=server.accept();
            System.out.println("连接成功..."+server.getInetAddress().getHostAddress());
            //es开始管理工作 并且创建线程运行规则 对接 拼接字对象s
            es.execute(new UserThread(s));
        }
    }
}

class UserThread implements Runnable{
    Socket s;

    //线程的构造函数 将s对象拉进内部制定规则
    public UserThread(Socket s) {
        this.s=s;
    }

    @Override
    public void run() {
        try {
            //1.分配发送和接收流  br ps   <- s
            BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
            PrintStream ps=new PrintStream(new BufferedOutputStream(s.getOutputStream()));
            String info=br.readLine();
            System.out.println(info);
            ps.println("echo: "+info);
            ps.flush();
            ps.close();
            br.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
